package common

import (
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"gopkg.in/natefinch/lumberjack.v2"
	"os"
	"path/filepath"
	"time"
)

var (
	Logger *zap.SugaredLogger
)

func InitLogger(config *ConfigFile) {
	// 定义日志文件路径
	logDir := config.Logger.LogDir
	logFilePath := filepath.Join(logDir, config.Logger.LogFile)

	// 创建目录（如果不存在）
	if err := os.MkdirAll(logDir, 0755); err != nil {
		panic(err)
	}

	// 打开日志文件
	file, err := os.OpenFile(logFilePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
	if err != nil {
		panic(err)
	}
	defer file.Close()

	// 配置 lumberjack 日志轮转
	lumberjackLogger := &lumberjack.Logger{
		Filename:   logFilePath, // 日志文件名
		MaxSize:    30,          // 单个日志文件的最大大小（MB）
		MaxBackups: 3,           // 保留的旧日志文件数量
		MaxAge:     30,          // 保留旧日志文件的最大天数
		Compress:   true,        // 是否压缩旧日志文件
	}

	// 创建写入器（支持同时输出到文件和控制台）
	writers := []zapcore.WriteSyncer{
		zapcore.AddSync(lumberjackLogger), // 输出到文件
		zapcore.AddSync(os.Stdout),        // 输出到控制台
	}

	encoderConfig := zap.NewProductionEncoderConfig()
	encoderConfig.EncodeTime = customTimeEncoder            // 设置自定义时间格式
	encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder // 日志级别大写

	// 创建 Core
	core := zapcore.NewCore(
		zapcore.NewConsoleEncoder(encoderConfig), // 使用 Console 格式
		zapcore.NewMultiWriteSyncer(writers...),
		zapcore.InfoLevel, // 设置日志级别
	)

	// 创建 Logger
	logger := zap.New(core)
	defer logger.Sync()

	Logger = logger.Sugar()
}

// 自定义时间格式化函数
func customTimeEncoder(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
	enc.AppendString(t.Format("2006-01-02 15:04:05"))
}
